package builder

import (
	"context"
)

// Builder 定义了构建器的基本行为
type Builder interface {
	// Prepare 准备构建环境
	// ctx: 上下文，用于取消操作
	// config: 构建配置
	// 返回错误信息
	Prepare(ctx context.Context, config *BuildConfig) error

	// Build 执行构建
	// ctx: 上下文，用于取消操作
	// 返回构建结果和错误信息
	Build(ctx context.Context) (*BuildResult, error)

	// Clean 清理构建环境
	// ctx: 上下文，用于取消操作
	// 返回错误信息
	Clean(ctx context.Context) error

	// LogPath 获取构建日志路径
	// 返回日志文件路径
	LogPath() string

	// ImageName 获取构建的镜像名称
	// 返回完整的镜像名称（包含标签）
	ImageName() string
}

// BuilderFactory 定义了构建器工厂的接口
type BuilderFactory interface {
	// CreateBuilder 创建构建器
	// buildTool: 构建工具类型（maven/gradle）
	// 返回构建器实例和错误信息
	CreateBuilder(buildTool string) (Builder, error)
}

// BuildConfig 构建配置
type BuildConfig struct {
	// 基本信息
	ServiceName string // 服务名称
	WorkDir     string // 工作目录
	CacheDir    string // 缓存目录

	// 构建工具配置
	BuildTool  string // 构建工具（maven/gradle）
	JDKVersion string // JDK版本（8/11/17/21）

	// 构建参数
	SkipTests bool     // 是否跳过测试
	Profile   string   // 构建环境（prod/test）
	Args      []string // 额外的构建参数

	// Docker配置
	DockerMirror string // Docker镜像源
	ImageName    string // 镜像名称
	ImageTag     string // 镜像标签

	// 资源限制
	CPULimit    string // CPU限制
	MemoryLimit string // 内存限制
}

// BuildResult 构建结果
type BuildResult struct {
	ArtifactPath string // 构建产物路径
	ImageID      string // Docker镜像ID
	Duration     int64  // 构建耗时（秒）
	LogFile      string // 日志文件路径
	CacheUsed    bool   // 是否使用了缓存
}

// BuildError 构建错误
type BuildError struct {
	Phase   string // 错误阶段
	Message string // 错误信息
	Cause   error  // 原始错误
}

// Error 实现error接口
func (e *BuildError) Error() string {
	if e.Cause != nil {
		return e.Message + ": " + e.Cause.Error()
	}
	return e.Message
}

// 构建阶段常量
const (
	PhasePrepare = "prepare" // 准备阶段
	PhaseBuild   = "build"   // 构建阶段
	PhaseDocker  = "docker"  // Docker阶段
	PhaseClean   = "clean"   // 清理阶段
)

// 构建工具类型常量
const (
	BuildToolMaven  = "maven"  // Maven构建工具
	BuildToolGradle = "gradle" // Gradle构建工具
)

// JDK版本常量
const (
	JDK8  = "8"  // JDK 8
	JDK11 = "11" // JDK 11
	JDK17 = "17" // JDK 17
	JDK21 = "21" // JDK 21
)

// 构建环境常量
const (
	EnvProd = "prod" // 生产环境
	EnvTest = "test" // 测试环境
)

// 默认值常量
const (
	DefaultJDKVersion = JDK21          // 默认JDK版本
	DefaultBuildTool  = BuildToolMaven // 默认构建工具
	DefaultImageTag   = "latest"       // 默认镜像标签
)

// NewBuildError 创建构建错误
func NewBuildError(phase, message string, cause error) *BuildError {
	return &BuildError{
		Phase:   phase,
		Message: message,
		Cause:   cause,
	}
}
